import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)
var cart = JSON.parse(localStorage.getItem('shopcart0102')||'[]')
//因为本地存储中只能存json字符串，所以你取出来的值也会是一个字符串，在这要进行判断，并重新赋值成布尔值
var selectall = localStorage.getItem('seleteall0102')==='false'?false:true
//从本地存储取值的时候，一定要考虑到没有这个键值的情况，给他添加一个空的数组
console.log(cart ,selectall);
export default new Vuex.Store({
  state: {
      shopcartData:cart,
      selectAll:selectall
  },
  mutations: {//在这里写方法名建议大写，这样可以区分mutation和methods中的方法
      ADD_SHOPCART(state,payload){ //这是修改state中shopcartdata这个数组的方法，负责添加数据到这个数组中
          //首先要判断你现在添加的商品，仓库中有没有这个商品，如果有，我只需要把这次购买的数量，累加到原来数量上
          //查找id的结果你要告诉我，我好决定执行不执行下一步，true
          //如果没有这个商品，我们就直接把这个商品对象扔到仓库中，直接push进去
          var isHas = state.shopcartData.some(item=>{ //item,表示仓库中每一个商品信息的对象
              if (payload.id === item.id) {//符合这个条件的，表示是同一个商品，我们把数量累加即可
                  item.count += payload.count
                  return true
              }
              // return payload.id===item.id
          })
            //isHas 接收一个返回值，这个值是false，表示没找到指定的商品，
          if (!isHas) { //如果没有找到符合条件的商品，我就直接向数组中添加整个对象进去,bi格很高的写法
              state.shopcartData.push(payload)
          }
       localStorage.setItem('shopcart0102',JSON.stringify(state.shopcartData))
      },
      CHANGE_STATUS(state,id){//修改state商品数组中某个商品的选中状态
          state.shopcartData.some(item=>{
              if (id===item.id){ //通过id去查找到对应的商品，然后变更其状态
                  item.selected = !item.selected
              }
          })
          //我们可以遍历所有的商品对象，如果发现有一个商品的选中状态为 false ，则让 全选 按钮变成 false
          // var x = state.shopcartData.some(item=>{  //如果有一个商品是false ，我们这个some方法就会找到他，返回true
          //     return item.selected===false
          // })
          // console.log(x);
          // if (x){ //如果x是true的话，就表示，有 '没选中的商品'，然后我就会让全选按钮变成 false
          //    state.selectAll = false
          // }else {
          //     state.selectAll = true
          // }

          //我们可以遍历所有的商品对象，如果发现有一个商品的选中状态为 false ，则让 全选 按钮变成 false
          //           // 也可以说：只有全部按钮都是选中的时候，全选按钮才能是选中
         var flag = state.shopcartData.every(item=>{//数组的every（）所有都满足条件才能返回true
              return item.selected === true
          });
          console.log(flag);
          if (flag) {
              state.selectAll = flag
          }else {
              state.selectAll = flag
          }
          localStorage.setItem('shopcart0102',JSON.stringify(state.shopcartData))
          localStorage.setItem('seleteall0102',JSON.stringify(state.selectAll))
      },
      INCREASE(state,payload){//增加数量，并将结果存入本地存储

          state.shopcartData.some(item=>{
              if (item.id===payload.id && item.count<payload.stock) {//通过id去查找到对应的商品，然后让item.count增加
                  item.count ++
              }
          })
          localStorage.setItem('shopcart0102',JSON.stringify(state.shopcartData))
      },
      DECREASE(state,payload){//减少数量，并将结果存入本地存储
              state.shopcartData.some(item=>{
                  if (item.id===payload.id && item.count>1){//通过id去查找到对应的商品，然后让item.count减少
                      item.count --
                  }
              })
          localStorage.setItem('shopcart0102',JSON.stringify(state.shopcartData))
      },
      DELETEGOODS(state,index){ //删除state中商品数组中的某个商品
          // window的三种弹出框，alert、confirm、prompt

          state.shopcartData.splice(index,1)//参数1，从第几个开始删除，参数2：删除几个，参数3、4、5就表示要添加的内容

          //删除某个商品后还要再检查一下所有商品的选中状态，然后赋值给全选按钮
          var flag = state.shopcartData.every(item=>{//数组的every（）所有都满足条件才能返回true
              return item.selected === true
          });
          console.log(flag);
          if (flag) {
              state.selectAll = flag
          }else {
              state.selectAll = flag
          }
          localStorage.setItem('shopcart0102',JSON.stringify(state.shopcartData))
          localStorage.setItem('seleteall0102',JSON.stringify(state.selectAll))
      },
      CHANGE_SELECT_ALL(state){ //修改state中selectall的状态值
          state.selectAll = !state.selectAll; //每一次点击都会首先让全选按钮状态取反
          state.shopcartData.forEach(item=>{ //遍历我们商品数组中的每一项，让全选按钮状态等于每一项的选中状态
              item.selected = state.selectAll
          })
          localStorage.setItem('shopcart0102',JSON.stringify(state.shopcartData))
          localStorage.setItem('seleteall0102',JSON.stringify(state.selectAll))
      }

  },
  actions: {
  },
  getters:{ //类似我们组件中的计算属性和过滤器,都有一个return
      goodscount(state){ //现在就相当于我们创造了一个属性，这个属性用来返回商品数组的数量
          return  state.shopcartData.length
      },
      goodsTotal(state){ //在购物车结算界面输出所有选中商品的数量和合计
        var  t = {count:0,total:0} //先赋值一个空的格式对象
        //state.shopcartData中满足条件（被选中的）的商品，数量累加到t.count中,把价格x数量放到total中，最后return t
          state.shopcartData.forEach(item=>{
              if (item.selected){
                  t.count += item.count;
                  t.total += item.count*item.price
              }
          })
          return t
      }
  },
  modules: {
  }
})
